package com.urbane.product.service.impl;

import com.urbane.product.service.ProductService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

/**
 * 商品查询服务（面向前端搜索）
 * 功能：
 *   - 处理用户搜索请求（关键词、筛选、排序）
 *   - 从 Elasticsearch 获取结果
 *   - 聚合品牌、价格、属性等 Facet（用于左侧筛选栏）
 *   - 返回精简版商品摘要（ProductSummary）
 *
 * 注意：
 *   - 不返回完整描述（节省带宽）
 *   - 不直接访问数据库，全部走 ES
 *   - 高性能，支持万级 QPS
 */
@Service
@RequiredArgsConstructor
public class ProductServiceImpl implements ProductService {

    private final ProductEsRepository productEsRepository;

    /**
     * 商品搜索（支持关键词、筛选、分页、排序）
     * 返回结果包含：商品列表 + 聚合统计（品牌、价格区间、属性）
     */
    public Page<ProductSummary> search(ProductSearchRequest request) {
        // 将请求参数转换为 ES 查询条件
        var query = ProductQueryBuilder.build(request);

        // 执行 ES 搜索
        Page<ProductIndex> esPage = productEsRepository.search(query);

        // 转换为前端需要的 ProductSummary
        return esPage.map(productIndex -> new ProductSummary(
                productIndex.getProductId(),
                productIndex.getName(),
                productIndex.getMinPrice(),
                productIndex.getMaxPrice(),
                productIndex.getMainImage(),
                productIndex.getTotalStock(),
                productIndex.getSalesCount(),
                productIndex.getAvgRating()
        ));
    }

    /**
     * 根据 ID 获取商品摘要（用于详情页顶部展示）
     */
    public ProductSummary findById(Long productId) {
        ProductIndex index = productEsRepository.findById(productId).orElse(null);
        if (index == null) {
            throw new ProductNotFoundException("商品不存在");
        }
        return new ProductSummary(
                index.getProductId(),
                index.getName(),
                index.getMinPrice(),
                index.getMaxPrice(),
                index.getMainImage(),
                index.getTotalStock(),
                index.getSalesCount(),
                index.getAvgRating()
        );
    }
}
